
// //离散化模版一：排序+去重+二分查找离散之后的结果

// #include <iostream>
// #include <algorithm>

// using namespace std;

// const int N = 1e5 + 10;

// int n;
// int a[N];

// int pos; // 标记去重之后的元素个数
// int disc[N]; // 帮助离散化

// int find(int x)
// {
// 	int l = 1, r = pos;
// 	while(l < r)
// 	{
// 		int mid = (l + r) / 2;
// 		if(disc[mid] >= x) r = mid;
// 		else l = mid + 1;
// 	}
// 	return l;
// }

// int main()
// {
// 	cin >> n;
// 	for(int i = 1; i <= n; i++)
// 	{
// 		cin >> a[i];
// 		disc[++pos] = a[i]; // 拷贝一份到离散化数组中
// 	}

// 	//离散化
// 	sort(disc + 1, disc + 1 + pos); // 排序
// 	pos = unique(disc + 1, disc + 1 + pos) - (disc + 1); // 去重
	
// 	//如何找到一个数在离散化数组中的位置？二分查找
// 	for(int i = 1; i <= n; i++)
// 	{
// 		cout << a[i] << "离散化之后：" << find(a[i]) << endl;
// 	}

// 	return 0;
// }



//离散化模版二：排序+哈希表去重以及记录最终的位置

#include <iostream>
#include <algorithm>
#include <unordered_map>

using namespace std;

const int N = 1e5 + 10;

int n;
int a[N];

int pos; // 标记去重之后的元素个数
int disc[N]; // 帮助离散化
unordered_map<int, int> id; //<原始的值，离散之后的值>

int main()
{
	cin >> n;
	for(int i = 1; i <= n; i++)
	{
		cin >> a[i];
		disc[++pos] = a[i]; // 拷贝一份到离散化数组中
	}

	//离散化
	sort(disc + 1, disc + 1 + pos); // 排序
	int cnt = 0; // 当前这个值是第几号元素
	for(int i = 1; i <= pos; i++)
	{
		int x = disc[i];
		if(id.count(x)) continue;
		cnt++;
		id[x] = cnt;
	}
	
	
	//如何找到一个数在离散化数组中的位置？二分查找
	for(int i = 1; i <= n; i++)
	{
		cout << a[i] << "离散化之后：" << id[a[i]] << endl;
	}

	return 0;
}